<?php
/**
 * @copyright 2025 银杏ERP
 * @author 银杏ERP
 * @version 1.0
 * @license http://www.hhyx.xyz
 * @developer Lhf
 */

namespace app\admin\model\yxerp;

use app\common\model\BaseModel;
use think\model\relation\BelongsTo;

/**
 * 采购单明细模型
 */
class PurchaseDetail extends BaseModel
{
    // 表名
    protected $name = 'yxerp_purchase_detail';
    
    // 开启自动写入时间戳字段
    protected $autoWriteTimestamp = true;
    
    // 可批量赋值的属性
    protected $fillable = [
        'purchase_id',
        'product_id',
        'sku',
        'product_name',
        'spec',
        'unit',
        'quantity',
        'price',
        'subtotal',
        'tax_rate',
        'tax_amount',
        'discount_rate',
        'discount_amount',
        'received_quantity',
        'rejected_quantity',
        'remark',
    ];
    
    /**
     * 购买产品关联
     * @return BelongsTo
     */
    public function product()
    {
        return $this->belongsTo(Product::class, 'product_id');
    }
    
    /**
     * 所属采购单关联
     * @return BelongsTo
     */
    public function purchase()
    {
        return $this->belongsTo(Purchase::class, 'purchase_id');
    }
    
    /**
     * 设置单价小数位数
     * @param mixed $value
     * @return float
     */
    public function setPriceAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置小计小数位数
     * @param mixed $value
     * @return float
     */
    public function setSubtotalAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置税率小数位数
     * @param mixed $value
     * @return float
     */
    public function setTaxRateAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置税额小数位数
     * @param mixed $value
     * @return float
     */
    public function setTaxAmountAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置折扣率小数位数
     * @param mixed $value
     * @return float
     */
    public function setDiscountRateAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置折扣金额小数位数
     * @param mixed $value
     * @return float
     */
    public function setDiscountAmountAttr($value)
    {
        return round((float)$value, 2);
    }
    
    /**
     * 设置产品名称
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function setProductNameAttr($value, $data)
    {
        // 如果未提供产品名称但提供了产品ID，则从产品表获取名称
        if (empty($value) && !empty($data['product_id'])) {
            $product = Product::find($data['product_id']);
            if ($product) {
                return $product->name;
            }
        }
        return $value;
    }
    
    /**
     * 设置产品规格
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function setSpecAttr($value, $data)
    {
        // 如果未提供产品规格但提供了产品ID，则从产品表获取规格
        if (empty($value) && !empty($data['product_id'])) {
            $product = Product::find($data['product_id']);
            if ($product) {
                return $product->spec;
            }
        }
        return $value;
    }
    
    /**
     * 设置产品单位
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function setUnitAttr($value, $data)
    {
        // 如果未提供产品单位但提供了产品ID，则从产品表获取单位
        if (empty($value) && !empty($data['product_id'])) {
            $product = Product::find($data['product_id']);
            if ($product) {
                return $product->unit;
            }
        }
        return $value;
    }
    
    /**
     * 设置产品SKU
     * @param mixed $value
     * @param array $data
     * @return string
     */
    public function setSkuAttr($value, $data)
    {
        // 如果未提供产品SKU但提供了产品ID，则从产品表获取SKU
        if (empty($value) && !empty($data['product_id'])) {
            $product = Product::find($data['product_id']);
            if ($product) {
                return $product->sku;
            }
        }
        return $value;
    }
} 